# -*- coding: utf-8 -*-
# @Time : 2025/6/26 14:04
# @FileName: 01.py
# @Target:
'''
使用 OpenAI 的方式调用 Ollama 服务
'''


import os
from openai import OpenAI
from openai.types.chat import ChatCompletion, ChatCompletionMessage


class OllamaClient:
    """
    Ollama 客户端，兼容 OpenAI API 规范
    支持聊天补全、流式响应、模型列表等功能
    """

    def __init__(self, base_url="http://117.50.223.179:11434", api_key="ollama", timeout=120):
        """
        初始化 Ollama 客户端

        :param base_url: Ollama 服务器地址
        :param api_key: API密钥（Ollama 不需要认证，但保留参数）
        :param timeout: 请求超时时间（秒）
        """
        self.client = OpenAI(
            base_url=f"{base_url}/v1",  # 使用兼容 OpenAI 的 /v1 端点
            api_key=api_key,
            timeout=timeout
        )

    def list_models(self):
        """获取可用的模型列表"""
        return self.client.models.list()

    def chat_completion(self, model, messages, **kwargs):
        """
        聊天补全（兼容 OpenAI 格式）

        :param model: 模型名称 (e.g. "llama3")
        :param messages: 消息列表 [{"role": "user", "content": "你好"}]
        :param kwargs: 其他参数 (stream, temperature, max_tokens, etc.)
        :return: ChatCompletion 对象
        """
        # 设置默认参数
        params = {
            "model": model,
            "messages": messages,
            "stream": kwargs.get("stream", False),
            "temperature": kwargs.get("temperature", 0.7),
            "max_tokens": kwargs.get("max_tokens", -1),
            "top_p": kwargs.get("top_p", 1.0),
            "frequency_penalty": kwargs.get("frequency_penalty", 0),
            "presence_penalty": kwargs.get("presence_penalty", 0),
        }

        # 添加可选参数
        optional_params = ["stop", "seed", "response_format"]
        for param in optional_params:
            if param in kwargs:
                params[param] = kwargs[param]

        # 发送请求
        response = self.client.chat.completions.create(**params)

        return response

    def stream_chat(self, model, messages, **kwargs):
        """流式聊天响应生成器"""
        kwargs["stream"] = True
        response = self.chat_completion(model, messages, **kwargs)

        for chunk in response:
            if chunk.choices:
                delta = chunk.choices[0].delta
                if delta.content:
                    yield delta.content



ollama = OllamaClient(
    base_url="http://117.50.223.179:11434",  # 替换为实际服务器地址
    timeout=180
)
# 示例4：列出可用模型
print("=" * 50)
print("可用模型列表:")
models = ollama.list_models()
for model in models.data:
    print(f"- {model.id}")
print("=" * 50)



class PROMPT:
    def __init__(self):
        ...

    def aaa (self):
        ...




# 使用示例
if __name__ == "__main__":
    # 初始化客户端（连接到远程服务器）
    content = """
## 你是一个专业的翻译专家，请将以下中文内容翻译成英文，并严格按照以下JSON格式返回结果：
**中文输入内容**：
操控是我最满意的，方向盘的指向很精准，我轮胎想压哪里就压哪里，提速很丝滑，超车的时候很有快感 最不满意的就是玻璃按键，经常误触，明明想开前面却打开后面 空间也还好，比我以前的高尔夫大一点，我一米八的身高坐后面还有空间，头部空间也还有，就是后备箱容积小了一点，不过我不怎么拉东西也还好 驾驶感受就是特别跟手，有种人车合一的感觉，提速丝滑没有顿挫，超车想超就超没有拖泥带水，上高速也特别稳 巡航就一般了，在市区不开空调慢慢开可能可以开到400，高速的话车速控制在110不开空调以内可以跑到350这样，如果冬天开暖气基本上跑200公里就要充电了 外观挺好看的，耐看，上市几年外观都没用大改动，不像某些车一年一个样，我买回来开一段时间后还给他贴了个改色膜 内饰就比较简单了，连中央扶手都没有，配一个小扶手（其实挺好用的），都2025年第一次还有新能源车这样的内饰 总体来说这个车的性价比还是可以的，同价位能买到这个操控的车基本没有，10万左右在乎驾驶感受的车友非他莫属，实用性还是稍微差点，空间一般，智能化也一般 智能话就不要报太大的希望了，连蓝牙钥匙都没有，每天还要抱着个钥匙开车，语音也是傻傻的经常自己崩出来讲话，导航也是不怎么好用，还好他可以连CarPlay，所以我一上车都是连CarPlay，用着也挺好
**要求**：
1. 翻译需准确传达原文含义，保持专业性和语义一致性。
2. 输出格式必须为：  
```json
{
 "src": "原始的中文内容",
 "dst": "翻译好的英文"
}
"""
    # 示例2：流式响应
    print("=" * 50)
    print("流式响应示例:")
    full_response = ""
    for chunk in ollama.stream_chat(
            model="qwq:32b-q8_0",
            messages=[
                {"role": "user", "content": content}
            ],
            temperature=0.7
    ):
        print(chunk, end="", flush=True)
        full_response += chunk

    print(f"\n\n完整回复: {full_response}\n")

"""
    # 示例1：基本聊天
    print("=" * 50)
    print("基本聊天示例:")
    response = ollama.chat_completion(
        model="qwq:32b-q8_0",
        messages=[
            {"role": "system", "content": "你是一个乐于助人的助手"},
            {"role": "user", "content": "用简单的语言解释量子计算"}
        ],
        max_tokens=500
    )

    print(f"模型: {response.model}")
    print(f"使用token数: {response.usage.total_tokens}")
    print(f"回复: {response.choices[0].message.content}\n")
"""



